<?php
namespace adibilis\AdminBundle\Controller;

use Symfony\Component\HttpFoundation\Request;


use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;



use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;

use JMS\SecurityExtraBundle\Annotation\Secure;
use Symfony\Component\HttpFoundation\RedirectResponse;
 


use adibilis\AdminBundle\Entity\Activite;
use adibilis\AdminBundle\Entity\Comment;

use adibilis\AdminBundle\Form\ImageType;
use adibilis\AdminBundle\Form\ActiviteType;
use adibilis\AdminBundle\Form\ActiviteEditType;
use adibilis\AdminBundle\Form\CommentType;

use adibilis\AdminBundle\Form\ActiviteSearchForm;

/*
Controller qui concerne les activités (à renommer)
Contient aussi les méthodes affichant la page d'accueil et à propos
*/
class AdminController extends Controller
{

  /*
  Affiche la page d'accueil du site
  */
  public function homeAction()
  {

    return $this->render('adibilisadminBundle:Admin:home.html.twig');
  }


  /*
  Affiche la page à propos
  */
 public function aboutAction()
  {

    return $this->render('adibilisadminBundle:Admin:about.html.twig');
  }


  /*
  Affiche la page des activités proches
  */
 public function nearActivitiesAction()
  {


  $repository = $this->getDoctrine()
                     ->getManager()
                     ->getRepository('adibilisadminBundle:Activite');
 
  // On récupère l'entité toutes les activités
  $activites = $repository->findAll();

  
  $repository = $this->getDoctrine()
                     ->getManager()
                     ->getRepository('adibilisadminBundle:Category');
 
  // On récupère l'entité toutes les catégories
  $categories = $repository->findAll();

    return $this->render('adibilisadminBundle:Admin:nearActivities.html.twig', array(
    'activites' => $activites, 'categories' => $categories
  ));
  
  
  }


  /*
  Affiche la page de liste des activités
  */
  public function indexAction()
  {


  $repository = $this->getDoctrine()
                     ->getManager()
                     ->getRepository('adibilisadminBundle:Activite');
 
 
  // Récupère toutes les activités si on est administrateur
  if ($this->get('security.context')->isGranted('ROLE_ADMIN')) {
    $activites = $repository->findAll();
  }
  else{
  // Récupère que les activités actives pour les autres utilisateurs
  $activites = $repository->findBy(array('active' => true));

  }



  $repository = $this->getDoctrine()
                     ->getManager()
                     ->getRepository('adibilisadminBundle:Category');
 
  // On récupère les catégories
  $categories = $repository->findAll();



  $repository = $this->getDoctrine()
                     ->getManager()
                     ->getRepository('adibilisadminBundle:Locality');
 
  // On récupère les localités
  $localities = $repository->findAll();


    return $this->render('adibilisadminBundle:Admin:index.html.twig', array(
    'activites' => $activites, 'categories' => $categories, 'localities' => $localities, 
  ));
  }

  
  /*
  Affiche la page de détails d'une activité
  */
  public function showAction($id)
  {


// On récupère le repository pour l'entité Activite
  $repository = $this->getDoctrine()
                     ->getManager()
                     ->getRepository('adibilisadminBundle:Activite');
 
  // On récupère l'entité correspondant à l'id $id
  $activite = $repository->find($id);

  // On refuse l'accès aux non administrateurs si l'activité n'est pas active
  if($activite->getActive() == false){
    if (!$this->get('security.context')->isGranted('ROLE_ADMIN')) {
        throw new AccessDeniedHttpException('Accès limité aux administrateurs');

    }

  }


// On récupère le repository pour l'entité Comment
 $repository = $this->getDoctrine()
                     ->getManager()
                     ->getRepository('adibilisadminBundle:Comment');
 
  // On récupère les commentaires de l'activité
  $comments = $repository->findByActivite($id, array('date' => 'asc'));

 // On compte le nombre de commentaires
  $nbComments = count($comments);

 
  // Ou null si aucune activité n'a été trouvé avec l'id $id
  if($activite === null)
  {
    throw $this->createNotFoundException('Activité[id='.$id.'] inexistant.');
  }




  // Ajout de commentaires

  $comment = new Comment();
  $comment->setUser($this->get('security.context')->getToken()->getUser());
  $comment->setActivite($activite);
  
 
    // On crée le formulaire grâce au CommentType
    $form = $this->createForm(new \adibilis\adminBundle\Form\CommentType(), $comment);
 
    // On récupère la requête
    $request = $this->getRequest();
 
    // On vérifie qu'elle est de type POST
    if ($request->getMethod() == 'POST') {

      $form->bind($request);

      if ($form->isValid()) {

        $em = $this->getDoctrine()->getManager();
        $em->persist($comment);
        $em->flush();


        // On définit un message flash
        $this->get('session')->getFlashBag()->add('info', 'Commentaire bien ajouté');
 
        // On redirige vers la page de visualisation de l'activite nouvellement créé
        return $this->redirect($this->generateUrl('adibilisadmin_voir', array('id' => $activite->getId())));
      }
    }

    //FIN Ajout de commentaire


    return $this->render('adibilisadminBundle:Admin:voir.html.twig', array(
      'activite'  => $activite, 'comments'  => $comments, 'nbComments' => $nbComments, 'form' => $form->createView()
    ));

  }

/*
  Méthode qui affiche la page d'ajout d'activité et permet l'ajout
 */

/**
   * @Secure(roles="ROLE_ADMIN")
   */
public function addAction()
  {

 // On crée un objet Activite
  $activite = new Activite();
 
    // On crée le formulaire grâce à l'ActiviteType
    $form = $this->createForm(new \adibilis\adminBundle\Form\ActiviteType(), $activite);
 
    // On récupère la requête
    $request = $this->getRequest();
 
    // On vérifie qu'elle est de type POST
    if ($request->getMethod() == 'POST') {
      // On fait le lien Requête <-> Formulaire
      $form->bind($request);
 
      // On vérifie que les valeurs rentrées sont correctes
      if ($form->isValid()) {

        // On l'enregistre notre objet $activite dans la base de données
        $em = $this->getDoctrine()->getManager();
        $em->persist($activite);
        $em->flush();
 
        // On définit un message flash
        $this->get('session')->getFlashBag()->add('info', 'Activité bien ajoutée');
 
        // On redirige vers la page de visualisation de l'activite nouvellement créé
        return $this->redirect($this->generateUrl('adibilisadmin_voir', array('id' => $activite->getId())));
      }
    }
 

  return $this->render('adibilisadminBundle:Admin:ajouter.html.twig', array(
    'form' => $form->createView(),
  ));




  }

  /*
  Méthode qui affiche la page de modification d'activité et permet la modification
 */

/**
   * @Secure(roles="ROLE_ADMIN")
   */
  public function modifyAction(\adibilis\adminBundle\Entity\Activite $activite)
  {
   
    // On utiliser le ActiviteEditType
    $form = $this->createForm(new ActiviteEditType(), $activite);
 
    $request = $this->getRequest();
 
    if ($request->getMethod() == 'POST') {
      $form->bind($request);
 
      if ($form->isValid()) {
        // On enregistre l'activite
        $em = $this->getDoctrine()->getManager();
        $em->persist($activite);
        $em->flush();
 
        // On définit un message flash
        $this->get('session')->getFlashBag()->add('info', 'Activité bien modifiée');
 
        return $this->redirect($this->generateUrl('adibilisadmin_voir', array('id' => $activite->getId())));
      }
    }
 
    return $this->render('adibilisadminBundle:Admin:modifier.html.twig', array(
      'form'    => $form->createView(),
      'activite' => $activite
    ));



  }
 
 /*
  Méthode qui affiche la page de suppression d'activité et permet la suppression
 */

/**
   * @Secure(roles="ROLE_ADMIN")
   */
 public function deleteAction(\adibilis\adminBundle\Entity\Activite $activite)
  {
    // On crée un formulaire vide, qui ne contiendra que le champ CSRF
    // Cela permet de protéger la suppression d'activite contre cette faille
    $form = $this->createFormBuilder()->getForm();
 
    $request = $this->getRequest();
    if ($request->getMethod() == 'POST') {
      $form->bind($request);
 
      if ($form->isValid()) {
        // On supprime l'activite
        $em = $this->getDoctrine()->getManager();
        $em->remove($activite);
        $em->flush();
 
        // On définit un message flash
        $this->get('session')->getFlashBag()->add('info', 'Activité bien supprimée');
 
        // Puis on redirige vers l'accueil
        return $this->redirect($this->generateUrl('adibilisadmin_acceuil'));
      }
    }
 
    return $this->render('adibilisadminBundle:Admin:supprimer.html.twig', array(
      'form'    => $form->createView(),
      'activite' => $activite
    ));
  }




/*
  Méthode qui affiche le formulaire d'ajout de commentaire
 */
public function commentAction()
    {
        $entity = new Comment();
        $form   = $this->createForm(new \adibilis\adminBundle\Form\CommentType(), $entity);

        return array(
            'entity' => $entity,
            'form'   => $form->createView(),
        );
    }


/*
  Méthode qui permet la suppression d'un commentaire
 */

/**
   * @Secure(roles="ROLE_ADMIN")
   */
public function deletecommentAction($idActivite, $idComment)
    {

        $em = $this->getDoctrine()->getManager();
        $comment = $em->getRepository('adibilisadminBundle:Comment')->find($idComment);

            if (!$comment) {
                throw $this->createNotFoundException('Unable to find Comment entity.');
            }

            $em->remove($comment);
            $em->flush();

    $this->get('session')->getFlashBag()->add('info', 'Commentaire bien supprimé');
    return $this->redirect($this->generateUrl('adibilisadmin_voir', array('id' => $idActivite)));


  }


/*
  Méthode qui permet de rediriger vers la page actuelle après une déconnexion
 */
public function redirectrefererAction()   
     {   
     
 $url = $this->getRequest()->headers->get("referer");    
         return new RedirectResponse($url);    
      
   }


}